/*
// =====================================================================================
// 
//       Filename:  gzlib_mm_block.hpp
// 
//    Description:  memory manager using block way(for fixed length)
// 
//        Version:  1.0
//        Created:  09/02/2013 05:03:43 PM
//       Revision:  none
//       Compiler:  g++
// 
//         Author:  Elwin.Gao (elwin), elwin.gao4444@gmail.com
//        Company:  
// 
// =====================================================================================
*/

#ifndef  _GZLIB_MM_BLOCK_H_
#define  _GZLIB_MM_BLOCK_H_

#include "gzlib_mm_seg.hpp"

// =====================================================================================
//        Class:  GZ_MM_Block
//  Description:  
// =====================================================================================
class GZ_MM_Block : public GZ_MM_Seg
{
public:
	// ====================  LIFECYCLE     =======================================
	GZ_MM_Block();
	~GZ_MM_Block();

	// ====================  INTERFACE     =======================================

	/* 
	// ===  FUNCTION  ======================================================================
	//         Name:  init
	//  Description:  初始化块大小, 段长（指定幂次）,和最多段个数（指定幂次）
	// =====================================================================================
	*/
	int init(size_t m_block_size, size_t seg_size_pow = 20, size_t seg_max_pow = 10);

	/* 
	// ===  FUNCTION  ======================================================================
	//         Name:  alloc
	//  Description:  分配内存，成功返回内存地址，失败返回NULL
	// =====================================================================================
	*/
	void* alloc();

	/* 
	// ===  FUNCTION  ======================================================================
	//         Name:  recycle
	//  Description:  尝试回收内存，并再利用，牺牲效率减缓内存增长的速度
	// =====================================================================================
	*/
	void recycle(void* pointer);

	/* 
	// ===  FUNCTION  ======================================================================
	//         Name:  block_size
	//  Description:   
	//   Parameters:  
	//  ReturnValue:  
	// =====================================================================================
	*/
	size_t block_size();

	/* 
	// ===  FUNCTION  ======================================================================
	//         Name:  clear
	//  Description:  释放申请过的所有内存
	// =====================================================================================
	*/
	void clear();

	/* 
	// ===  FUNCTION  ======================================================================
	//         Name:  destroy
	//  Description:  销毁对象
	// =====================================================================================
	*/
	void destroy();

private:
	// ==================== PRIVATE METHOD =======================================

	// ====================  DATA MEMBERS  =======================================
	size_t m_block_size;
	void *recycle_pointer;

	GZ_Spin_Lock locker;
};		// -----  end of class GZ_MM_Block  -----


#endif   // ----- #ifndef _GZLIB_MM_BLOCK_H_  -----
